package cn.personal.study.springbootdemo.repository;

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import cn.personal.study.springbootdemo.domain.Student;
import cn.personal.study.springbootdemo.domain.dto.response.ViewStudentResponseDTO;

/**
 * 学生数据层仓库
 *
 * @author duliurui
 */
public interface StudentRepository
        extends JpaRepository<Student, String>, JpaSpecificationExecutor<Student> {


    /**
     * 通过学生姓名查询,根据spring-data-jpa的查询规范命名
     *
     * @param age 学生姓名
     * @return 学生信息查询结果集合
     */
    List<Student> findByAgeGreaterThan(int age);

    List<Student> findByAgeIsGreaterThan(int age);



    /**
     * 更新学生的姓名和年龄字段
     *
     * @param name 姓名
     * @param age  年龄
     * @param id   id
     */
    @Modifying
    @Query("update Student set name=:name, age=:age where id=:id")
    void updateNameAndAge(@Param("name")String name, @Param("age")int age, @Param("id")String id);


    /**
     * 通过学生姓名模糊查询,根据spring-data-jpa的查询规范命名
     *
     * @param name     学生姓名
     * @param pageable 分页信息
     * @return 学生信息查询结果集合
     */
    Page<Student> findByNameContaining(String name, Pageable pageable);

    /**
     * 通过注解@Query的查询语句
     *
     * @param loves 爱好
     * @return 学生信息查询结果集合
     */
    @Query("select p from Student p where p.loves like %:loves%")
    List<Student> findByQueryAnnatationLoves(@Param("loves") String loves);

    /**
     * 本地sql查询
     *
     * @param name 学生姓名
     * @return 学生信息查询结果集合
     */
    @Query(value = "SELECT * FROM test_student WHERE name = :name", nativeQuery = true)
    List<Student> findNativeSqlByName(@Param("name") String name);

    /**
     * 执行修改语句,删除指定用户名的学生
     *
     * @param name 学生姓名
     */
    @Modifying
    @Query("delete from Student p where p.name = :name")
    void deleteByName(@Param("name") String name);

    /**
     * 查询部分字段,
     *
     * @param name 用户名
     * @return {Student}对象List
     */
    @Query("select new cn.personal.study.springbootdemo.domain.dto.response.ViewStudentResponseDTO(p.id, " +
            "p.name, p.age) from Student p where p.name like %:name%")
    List<ViewStudentResponseDTO> findPartFiledsReturnObjectLikeName(@Param("name") String name);

}
